Create custom error types.
Features
Examples
Custom error types
import errorType from 'error-type'
const UserError = errorType('UserError')
const SystemError = errorType('SystemError')
try {
throw new UserError('message')
} catch (error) {
console.log(error.name)
console.log(error instanceof UserError)
}
Error properties
const userError = new UserError('message', { userId: 56 })
console.log(userError.userId)
Error cause
try {
doSomething()
} catch (cause) {
throw new UserError('message', { cause })
}
Custom initialization logic
const DatabaseError = errorType('DatabaseError', (error, params) => {
error.dbId = params.databaseId
})
const databaseError = new DatabaseError('message', { databaseId: 2 })
console.log(databaseError.dbId)
console.log(databaseError.databaseId)
Install
npm install error-type
This package is an ES module and must be loaded using
an import
or import()
statement,
not require()
.
API
errorType(errorName, onCreate?)
errorName
string
onCreate
(error, params) => void
Return value: ErrorType
Custom initialization logic
onCreate(error, params)
is optional and is called on
new ErrorType('message', params)
.
By default, it sets any params
as error
properties. However, you can
override it with any custom logic to validate, normalize params
, etc.
Error type properties
Some error properties are the same for all instances of a given error type. In
other words, those are properties of the error type, not of specific instances.
Those can be set by using a separate object with each error type's properties.
They can be assigned using onCreate()
:
const ERROR_PROPS = {
UserError: { isBug: false },
DatabaseError: { isBug: false },
CoreError: { isBug: true },
}
const onCreate = function (error, params) {
Object.assign(error, params, ERROR_PROPS[error.name])
}
const UserError = errorType('UserError', onCreate)
const DatabaseError = errorType('DatabaseError', onCreate)
const CoreError = errorType('CoreError', onCreate)
Alternatively, the logic that catches/handles the error can retrieve those error
properties instead:
const UserError = errorType('UserError')
const DatabaseError = errorType('DatabaseError')
const CoreError = errorType('CoreError')
const ERROR_PROPS = {
UserError: { isBug: false },
DatabaseError: { isBug: false },
CoreError: { isBug: true },
}
try {
doSomething()
} catch (error) {
const isBug =
error instanceof Error && error.name in ERROR_PROPS
? ERROR_PROPS[error.name].isBug
: true
}
Best practices
Constructor
A common pattern for custom error types is:
class CustomError extends Error {
constructor(message) {
super(message)
this.name = 'CustomError'
}
}
However, this has several issues (which error-type
handles):
error.cause
is not set- Unlike native error types,
error.name
is:
- Enumerable, although it should not. For example,
for (const key in error)
will iterate over name
, which is unexpected. - Set on the error instance instead of its prototype. In Node.js, this
sometimes results in the error name being printed as
Error [CustomError]
instead of CustomError
.
Polyfills
Some Error
polyfills (such as
es-shims/error-cause
prevent
extending from it. This library includes
some logic
to fix this.
Related projects
Support
For any question, don't hesitate to submit an issue on GitHub.
Everyone is welcome regardless of personal background. We enforce a
Code of conduct in order to promote a positive and
inclusive environment.
Contributing
This project was made with ❤️. The simplest way to give back is by starring and
sharing it online.
If the documentation is unclear or has a typo, please click on the page's Edit
button (pencil icon) and suggest a correction.
If you would like to help us fix a bug or add a new feature, please check our
guidelines. Pull requests are welcome!